import pymysql
from dbutils.pooled_db import PooledDB
#import sys
#sys.path.append("/var/www/html/zhongkao/config")

from config.config import DB_CONFIG, PROJECT_CONFIG

pool = PooledDB(pymysql, blocking=True, host=DB_CONFIG["host"], user=DB_CONFIG["user"],
                passwd=DB_CONFIG["password"], database=DB_CONFIG["database"], port=DB_CONFIG["port"],
                charset=DB_CONFIG["charset"])


# 利用线差平均算法计算预估分数线
def CalPreAcceptScoreByAverage(SchoolCode, baseScore=501):
    """
    输入学校代码和当年普高线，计算学校当年录取的预估分数

    :param SchoolCode: 学校代码，str,与西安市教育局志愿填报系统一致
    :param baseScore: 当年城六区普高线，float
    :return: 由算法计算得到的，学校代码对应的学校的预估分，
    """
    conn = pool.connection()
    cursor = conn.cursor()
    sql = f"select * from AcceptedInfo where SchoolCode={SchoolCode}"
    cursor.execute(sql)
    results = cursor.fetchall()
    cursor.close()
    conn.close()
    #print(results)
    # 记录线差值（录取线与普高线的差值）
    DiffScore = []
    # 记录年份数据，防止数据库中同一年记录多份数据
    tempYear = []
    for i in results:
        if i[2] not in tempYear:  # 防止同一年份有多个录取线
            if i[3] and i[4]:  # 数据库中录取线和普高线齐全，则利用线差平均值法计算预估线
                DiffScore.append(i[3] - i[4])
                tempYear.append(i[2])
            elif not i[3]:  # 若数据库中录取线未记录，则不进行计算
                #print("请补全数据库中的学校录取线")
                continue
            elif not i[4]:  # 若数据库中普高线未记录，则不进行计算
                #print("请补全数据库中的普高线")
                continue
    #print(DiffScore)
    if len(DiffScore) != 0:  # 避免除0错误
        # 先计算几年线差的平均，然后加上当年的普高线，作为最终的预估线，但学校估分普遍高一点，因此加了10
        preAcceptScore = baseScore + sum(DiffScore) / len(DiffScore) + 10
    else:  # 若根据数据无法计算出线差，则用0表示预估线
        preAcceptScore = 0
    return preAcceptScore


# 将计算出来的预估分，导入到数据库中
def importPreAcceptScore(baseScore=501):
    """
    调用预估线计算函数，传入学校的代码和普高线，计算对应的预估线，并将预估线写入到数据库。
    :param baseScore: 当年普高线
    :return:
    """
    conn = pool.connection()
    cursor = conn.cursor()
    sql = f"select SchoolCode from SchoolInfo "
    cursor.execute(sql)
    results = cursor.fetchall()
    #TODO 此处有潜在bug,每次都是新插入数据，而不能更新数据，因为主码是数据库自动生成的，没有指定
    for i in results:
        preAcceptScore = CalPreAcceptScoreByAverage(SchoolCode=i[0], baseScore=baseScore)
        sql = f"insert into PreAcceptInfo(SchoolCode, PreAcceptScoreByAverage) values ('{i[0]}', {preAcceptScore})"
        sql += f" on duplicate key update PreAcceptScoreByAverage={preAcceptScore}"
        cursor.execute(sql)
    conn.commit()
    cursor.close()
    conn.close()

if __name__ == '__main__':
    importPreAcceptScore(baseScore=501)
